package Shifu.MainServer.Management;

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.io.Serializable;

/**
 * Contiene tutti i Peer del sistema
 */

public class PeersRing implements Serializable {
	
	/* campi */
	private List ring;
	private int  indexring;


	/* costruttore */

	/**
	 * Instanzia l'oggetto anello
	 */

	public PeersRing() {
		ring = new ArrayList();
		this.indexring = 0;	//posizione indice ring
	}

	/* metodi */
	
	/**
 	 * Inserisce un peer nell'anello
	 * @param peer il peer da inserire
	 * @return 1 se l'inserimento è riuscito, -1 altrimenti
	 */

	public int insertPeer(Peer peer) {

		//Controlla che l'oggetto non sia gia inserito
		if(ring.contains(peer)) {
			System.out.println("PeersRing: Errore in add del ring: Peer già presente");
			return -1;
		}

		ring.add(peer);
		System.out.println("PeersRing: Peer : "+peer.getId()+" aggiunto al ring");
		return 1;	
	}


	/**
	 * Ritorna il peer richiesto
	 * @return peer richiesto
	 */

	public Peer getPeer(Peer peer) {
		return (Peer) ring.get(ring.indexOf(peer));
	}

	/**
	 * Ritorna il peer all'indice i-esimo
	 * @param i indice dell peer
	 * @return il peer richiesto
	 */

	public Peer getPeer(int i) {
		return (Peer) ring.get(i);
	}

	/**
	 * Ritorna il peers con un dato id
         */	

	public Peer getPeerbyId(int i) {
		Iterator it = ring.iterator();
		while(it.hasNext()) {
			Peer val = (Peer) it.next();
			if(val.getId().equals(Integer.toString(i)))
				return val;
		}
		return null;
	}
	

	/**
	 * Rimuove un peer dell'anello
	 * @param peer il peer da rimuovere
	 * @return 1 se la rimozione ha avuto successo, -1 altrimenti
	 */

	public int removePeer(Peer peer) {

		//Controlla che l'oggetto esista
		if(!ring.contains(peer)) {
			System.out.println("PeersRing: Errore in remove del ring: Peer non presente");
			return -1;
		}

		ring.remove(peer);
		System.out.println("PeersRing: Peer : "+peer.getId()+" eliminato dal ring ");
		return 1;
	}


	/**
	 * Indica il numero di peers presenti
	 * @return il numero di peers
	 */

	public int size() {
		return ring.size();
	}

	
	/**
	 * Restitusce il peer successivo
	 * @return il peer successivo
	 */

	public Peer getNextPeer() {
 
		/*Visitato tutti i Peers, ritorno al primo*/
		if(indexring >= ring.size()) {
			indexring = 0;
		}

		Peer current = (Peer) ring.get(indexring);
		indexring++;	//Incremento il contatore
		return current;
	}


	/**
	 * Elenca tutti i peers presenti sull'anello
	 */

	public void printAllPeers() {
		
		Iterator it = ring.iterator();
		while(it.hasNext()) {
			Peer val = (Peer) it.next();
			System.out.println(val.toString());
		}
	}


	/**
         * Crea una stringa contenente tutti i Peer presenti
         * @return stringa con tutti i peer
	 */

	public String getPeerList() {

		String str = "";
		Iterator it = ring.iterator();
		while(it.hasNext()) {
			Peer val = (Peer) it.next();
			str=str+val.toString()+"\n";
		}
		return str;
	}			
}
